windows汇编之max

#include <stdio.h>

void max(int *a, int *b);

void main（）
{
	int a = 5, b = 6;

	max(&a, &b);
	printf("max = %d\n", a);
}

void max(int *a, int *b)
{
	if (*a < *b)
		*a = *b;
}

asm:
sub esp, 00000008			; 为局部变量分配内存
lea eax, dword ptr [esp+04]	; eax指向变量
lea ecx, dword ptr [esp]	; ecx指向变量
push eax					; 指向参数b的字符指针入栈
push ecx					; 指向参数a的字符指针入栈
mov [esp+08], 00000005		; 将参数a的值放入
mov [esp+0C], 00000006		; 将参数b的值放入
call 00401040				; max(&a, &b)
mov edx, [esp+08]			; 利用变量[esp+08]返回函数值
push edx
push 00407030
call 00401060				; printf
xor eax, eax
add esp, 18
retn

; 00401040:max(&a, &b)
mov eax, dword ptr [esp+08]	; 执行后，eax就是指向参数b的指针
mov ecx, dword ptr [esp+04]	; 执行后，ecx就是指向参数a的指针
mov eax, dword ptr [eax]	; 将参数b的值加载到eax中
mov edx, dword ptr [ecx]	; 将参数a的值加载到edx中
cmp edx, eax				; 比较参数a和b的大小
jge 00401052				; 若a<b，则不跳转
mov dword ptr [ecx], eax	; 将较大的值放到参数a所指的数据区中
ret


